/* ArithmeticException.cpp
 * 
 *  Author          : Alexander J. Yee
 *  Date Created    : 04/09/2017
 *  Last Modified   : 04/09/2017
 * 
 */

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Dependencies
#include "PublicLibs/ConsoleIO/BasicIO.h"
#include "PublicLibs/ConsoleIO/Label.h"
#include "PublicLibs/ExportSafeLibs/Stream.h"
#include "ExceptionSerialization.h"
#include "ArithmeticException.h"
namespace ymp{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
YMP_EXCEPTION_DEFINITIONS(ArithmeticException)
YMP_EXCEPTION_DEFINITIONS(ExponentOverflowException)
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
ExponentOverflowException::ExponentOverflowException(const char* function, siL_t value, siL_t limit)
    : ArithmeticException(function, "")
    , m_value(value)
    , m_limit(limit)
{}
void ExponentOverflowException::print() const{
    Console::ConsoleLockScope lock;
    Console::println("\n", 'R');
    Console::println_labelc("Exception Encountered", get_typename());
    Console::println();
    Console::println("Floating-point exponent has exceeded internal limit:");
    Console::println_labelm         ("    Function: ", m_function);
    Console::println_labelm_commas  ("    Value: ", m_value);
    Console::println_labelm_commas  ("    Limit: ", m_limit);
    Console::println("\n");
    Console::set_color('w');
}
ExponentOverflowException::ExponentOverflowException(SerializationPassKey key, const char*& stream)
    : ArithmeticException(key, stream)
{
    ExceptionTools::parse(stream, m_value);
    ExceptionTools::parse(stream, m_limit);
}
void ExponentOverflowException::serialize(std::string& stream) const{
    ArithmeticException::serialize(stream);
    ExceptionTools::write(stream, m_value);
    ExceptionTools::write(stream, m_limit);
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
[[noreturn]] YM_NO_INLINE void throw_ExponentOverflowException(const char* function, siL_t value, siL_t limit){
    throw ExponentOverflowException(function, value, limit);
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}
